#include "MCUPhaser.h"
#include "MCUInit.h"
#include "stdlib.h"
#include "string.h"
#include "stdio.h"
#include "ctype.h"
#include "MCUVardefine.h"
#include "MCUIO.h"
#include "MCUInit.h"
#include "MCUUart.h"

#ifndef BUFFER_LEN
#define BUFFER_LEN 9
#endif

char RxBuffer[RX_BUFFER];
char TxBuffer[TX_BUFFER];

short Sum = 0;
u8 StrLen = 0;
u8 Idx = 0;
char DataTransBuffer[BUFFER_LEN] = {0, 0, 0, 0, 0, 0, 0, 0, 0};

#define DATALEN 7
xdata float NTC1Data[DATALEN], NTC2Data[DATALEN];

u8 Idx1 = 0;
u8 Idx2 = 0;
float Ntc1Filter(float val)
{
    float sum = 0;
    float min = val;
    float max = val;
    if (Idx1 >= (DATALEN - 1))
    {
        Idx1 = 0;
    }
    else
    {
        Idx1++;
    }
    NTC1Data[Idx1] = val;
    for (int i = 0; i < DATALEN; i++)
    {
        sum += NTC1Data[i];
        if (min > NTC1Data[i])
        {
            min = NTC1Data[i];
        }
        if (max < NTC1Data[i])
        {
            max = NTC1Data[i];
        }
    }
    sum -= min;
    sum -= max;
    return (sum) / (DATALEN - 2);
}

float Ntc2Filter(float val)
{
    float sum = 0;
    float min = val;
    float max = val;
    //0 1
    //1 2
    //2 3
    //3 4
    //4 5
    //5 6
    //6 0
    if (Idx2 >= (DATALEN - 1))
    {
        Idx2 = 0;
    }
    else
    {
        Idx2++;
    }
    NTC2Data[Idx2] = val;
    for (int i = 0; i < DATALEN; i++)
    {
        sum += NTC2Data[i];
        if (min > NTC2Data[i])
        {
            min = NTC2Data[i];
        }
        if (max < NTC2Data[i])
        {
            max = NTC2Data[i];
        }
    }
    sum -= min;
    sum -= max;
    return (sum) / (DATALEN - 2);
}

xdata char smsg[64] = {0};
//xdata u8 CmdSel = FUN_NAN;
xdata short Para = 0x0;
char *token = NULL; //, idx = 0;
extern void ResetVar(void);

#define CMD_NONE 0
#define CMD_IO 1
extern u16 PinState;
void Phaser(void)
{
#if 0
    CmdSel = CMD_NONE;
    token = NULL;
    Idx = 0;
    token = strtok(RxBuffer, ":");
    while (token)
    {
        switch (Idx)
        {
        case 0:
            if (0 == strcmp(token, "R2"))
            {
                CmdSel = CMD_IO;
            }
            else
            {
                goto EndPhaser;
            }
            break;
        case 1:
             NTC2 = strtol(token, NULL, 16);
           // NTC2 = Ntc2Filter(strtol(token, NULL, 16));
            break;
        case 2:
            NTC1 = strtol(token, NULL, 16);
          //  NTC1 = Ntc1Filter(strtol(token, NULL, 16));
            break;
        case 3:
            //不中断不是一个bug
            PinState &= ~(S2PROTO_PIN_ZERO1 | S2PROTO_PIN_ZERO2);
            PinState |= (S2PROTO_PIN_ZERO1 | S2PROTO_PIN_ZERO2) & strtol(token, NULL, 16);
            break;
        default:
            break;
        }
        token = strtok(NULL, ":");
        Idx++;
    }

EndPhaser:
    return;

    // //    short _data = 0;
    // if (isParityOK(RxBuffer))
    // {

    //     token = NULL;
    //     Idx = 0;
    //     token = strtok(RxBuffer, ":");
    //     while (token)
    //     {
    //         switch (Idx)
    //         {
    //         case 0:
    //             CmdSel = FunStrToFunInt(token);
    //             break;
    //         case 1:
    //             Para = strtol(token, NULL, 16);
    //             switch (CmdSel)
    //             {
    //             case FUN_NAN:
    //                 goto EndPhaser;
    //                 // break;
    //             case WRA:
    //                 PortAData = Para;
    //                 goto EndPhaser;
    //                 // break;
    //             case WRB:
    //                 PortBData = Para;
    //                 goto EndPhaser;
    //                 // break;
    //             case WRC:
    //                 PortCData = Para;
    //                 goto EndPhaser;
    //                 // break;
    //             case WRD:
    //                 PortDData = Para;
    //                 goto EndPhaser;
    //                 // break;
    //             case ADC:
    //             {
    //                 // adc
    //                 u8 Channel = Para >> 12;
    //                 short data = Para & 0xFFF;
    //                 switch (Channel)
    //                 {
    //                 case 3:
    //                     NTC1 = data;
    //                     break;
    //                 case 4:
    //                     NTC2 = data;
    //                     break;
    //                 default:
    //                     NTC2 = data;
    //                     break;
    //                 }
    //             }
    //                 goto EndPhaser;
    //             // break;
    //             case BUZ:
    //             {
    //                 goto EndPhaser;
    //             }
    //             // break;
    //             case RST:
    //                 goto EndPhaser;
    //                 // break;

    //             case WA:
    //                 PortAData = Para;
    //                 goto EndPhaser;
    //                 // break;
    //             case WB:
    //                 PortBData = Para;
    //                 goto EndPhaser;
    //                 // break;
    //             case WC:
    //                 PortCData = Para;
    //                 goto EndPhaser;
    //                 // break;
    //             case WD:
    //                 PortDData = Para;
    //                 goto EndPhaser;
    //                 // break;

    //             default:
    //                 goto EndPhaser;
    //                 // break;
    //             } // end switch (CmdSel)
    //             // break;
    //         default:
    //             break;
    //         }
    //         token = strtok(NULL, ":");
    //         Idx++;
    //     }
    // }
		#endif
}

char BufferIdx = 0, BufferLen = 0, TxCh = '\n', RxBufferIdx = 0;

#ifdef USE_INTUART
char GetSendBuffer()
{
    if (true == isUartSend)
    {
        return ((BufferLen - BufferIdx) < 1 ? 0 : (BufferLen - BufferIdx));
    }
    if (BufferIdx < BufferLen)
    {
        isUartSend = true;
        TxCh = TxBuffer[BufferIdx];
        ll_uart_tx(UART1, TxCh);
        BufferIdx++;
    }
    return ((BufferLen - BufferIdx) < 1 ? 0 : (BufferLen - BufferIdx));
}

u8 SetSendBuffer(char *strdata)
{
    // ABCDE\0 5
    StrLen = strlen(strdata);
    if (StrLen >= TX_BUFFER)
    {
        StrLen = (TX_BUFFER - 2);
    }
    for (Idx = 0; Idx < StrLen; Idx++)
    {
        // a b c d e 0 1 2 3 4
        TxBuffer[Idx] = strdata[Idx];
    }
    //�ڷ����ַ����Ľ�β����\0
    if (0 != TxBuffer[StrLen - 1])
    {
        TxBuffer[StrLen] = 0;
        BufferLen = StrLen;
    }
    else
    {
        BufferLen = StrLen - 1;
    }
    BufferIdx = 0;
    return BufferLen;
}
#endif
void SetRxBuffer(char _ch)
{
    RxBuffer[RxBufferIdx] = _ch;
    if (RxBufferIdx >= RX_BUFFER)
    {
        RxBufferIdx = 0;
    }
    else
    {
        RxBufferIdx++;
    }
}

u8 GetCurRxBufferTail()
{
    if (RxBufferIdx > 0)
    {
        return RxBuffer[RxBufferIdx - 1];
    }
    else
    {
        return RxBuffer[0];
    }
}

void ResetRxIndex()
{
    memset(RxBuffer, 0x0, RX_BUFFER);
    RxBufferIdx = 0;
}

char GetRxBufferLen(void)
{
    return RxBufferIdx;
}
